﻿/* 
* Copyright (c) 2010, The University of Texas at Austin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, 
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, 
* this list of conditions and the following disclaimer in the documentation and/or other materials 
* provided with the distribution.
*
* Neither the name of The University of Texas at Austin nor the names of its contributors may be 
* used to endorse or promote products derived from this software without specific prior written 
* permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using System;
using System.Windows.Media;
using System.Xml;
using System.Xml.Serialization;
using Bio.Views.Structure.Editor.Internal.Rendering;

namespace Bio.Views.Structure.Editor.Internal.Options
{
    public class BasePairVisualRenderingOptions : IXmlSerializable
    {
        public Brush BasePairConnectorStroke { get; set; }
        public double BasePairConnectorStrokeThickness { get; set; }
        public double BasePairConnectorSize { get; set; }
        public Brush BasePairConnectorFill { get; set; }
        public BasePairConnectorRenderingMode BasePairConnectorRenderingStyle { get; set; }
        public bool BasePairConnectorIsFilled { get; set; }
        public bool BasePairConnectorIsVisible { get; set; }

        public BasePairVisualRenderingOptions(BasePairVisualRenderingOptions toCopy)
        {
            BasePairConnectorStrokeThickness = toCopy.BasePairConnectorStrokeThickness;
            BasePairConnectorStroke = toCopy.BasePairConnectorStroke.CloneCurrentValue();
            BasePairConnectorSize = toCopy.BasePairConnectorSize;
            BasePairConnectorRenderingStyle = toCopy.BasePairConnectorRenderingStyle;
            BasePairConnectorIsVisible = toCopy.BasePairConnectorIsVisible;
            BasePairConnectorIsFilled = toCopy.BasePairConnectorIsFilled;
            BasePairConnectorFill = toCopy.BasePairConnectorFill.CloneCurrentValue();
        }

        public BasePairVisualRenderingOptions()
        {
            BasePairConnectorRenderingStyle = BasePairConnectorRenderingMode.Line;
            BasePairConnectorStroke = new SolidColorBrush(Colors.Black);
            BasePairConnectorStrokeThickness = 1.5;
            BasePairConnectorSize = 4.0;
            BasePairConnectorFill = new SolidColorBrush(Colors.Black);
            BasePairConnectorIsFilled = false;
            BasePairConnectorIsVisible = true;
        }

        #region IXmlSerializable Members

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
            BrushConverter brushConverter = new BrushConverter();
            if (reader.MoveToAttribute("BasePairConnectorStroke") && !string.IsNullOrEmpty(reader.Value))
            {
                try
                {
                    BasePairConnectorStroke = (Brush)brushConverter.ConvertFromString(reader.Value);
                }
                catch { }
            }

            if(reader.MoveToAttribute("BasePairConnectorFill") && !string.IsNullOrEmpty(reader.Value))
            {
                try
                {
                    BasePairConnectorFill = (Brush)brushConverter.ConvertFromString(reader.Value);
                }
                catch { }
            }

            if(reader.MoveToAttribute("BasePairConnectorRenderingStyle") && !string.IsNullOrEmpty(reader.Value))
            {
                BasePairConnectorRenderingMode val;
                if(Enum.TryParse<BasePairConnectorRenderingMode>(reader.Value, out val))
                    BasePairConnectorRenderingStyle = val;
            }

            if(reader.MoveToAttribute("BasePairConnectorSize") && !string.IsNullOrEmpty(reader.Value))
            {
                double val;
                if (double.TryParse(reader.Value, out val) && val > 0.0)
                    BasePairConnectorSize = val;
            }

            if (reader.MoveToAttribute("BasePairConnectorStrokeThickness") && !string.IsNullOrEmpty(reader.Value))
            {
                double val;
                if (double.TryParse(reader.Value, out val) && val > 0.0)
                    BasePairConnectorStrokeThickness = val;
            }

            if (reader.MoveToAttribute("BasePairConnectorIsFilled") && !string.IsNullOrEmpty(reader.Value))
            {
                bool val;
                if (bool.TryParse(reader.Value, out val))
                    BasePairConnectorIsFilled = val;
            }

            if (reader.MoveToAttribute("BasePairConnectorIsVisible") && !string.IsNullOrEmpty(reader.Value))
            {
                bool val;
                if (bool.TryParse(reader.Value, out val))
                    BasePairConnectorIsVisible = val;
            }
        }

        public void WriteXml(XmlWriter writer)
        {
            if (BasePairConnectorStroke != null)
                writer.WriteAttributeString("BasePairConnectorStroke", BasePairConnectorStroke.ToString());

            if (BasePairConnectorFill != null)
                writer.WriteAttributeString("BasePairConnectorFill", BasePairConnectorFill.ToString());

            writer.WriteAttributeString("BasePairConnectorRenderingStyle", BasePairConnectorRenderingStyle.ToString());
            writer.WriteAttributeString("BasePairConnectorSize", BasePairConnectorSize.ToString());
            writer.WriteAttributeString("BasePairConnectorStrokeThickness", BasePairConnectorStrokeThickness.ToString());
            writer.WriteAttributeString("BasePairConnectorIsFilled", BasePairConnectorIsFilled.ToString());
            writer.WriteAttributeString("BasePairConnectorIsVisible", BasePairConnectorIsVisible.ToString());
        }

        #endregion
    }
}
